package xutil

import (
	"strings"

	"github.com/mozillazg/go-pinyin"
)

// firstletter // 首字母风格，只返回拼音的首字母部分。如： z g
// full1 // 普通风格1，不带声调（默认风格）。如： zhong guo
// full2 // 声调风格2，拼音声调在韵母第一个字母上。如： zhōng guó
// full3 // 声调风格3，即拼音声调在各个拼音之后，用数字 [1-4] 进行表示。如： zhong1 guo2
// finals1 // 韵母风格1，只返回各个拼音的韵母部分，不带声调。如： ong uo
// finals2 // 韵母风格2，带声调，声调在韵母第一个字母上。如： ōng uó
// finals3 // 韵母风格3，带声调，声调在各个拼音之后，用数字 [1-4] 进行表示。如： ong1 uo2
func PinYin(str string, style ...string) string {
	_style := "full1"
	if len(style) > 0 {
		_style = style[0]
	}

	args := pinyin.NewArgs()
	switch _style {
	case "full1":
	case "full2":
		args.Style = pinyin.Tone
	case "full3":
		args.Style = pinyin.Tone3
	case "finals1":
		args.Style = pinyin.Finals
	case "finals2":
		args.Style = pinyin.FinalsTone
	case "finals3":
		args.Style = pinyin.FinalsTone3
	}

	new_arr := []string{}
	str = strings.ReplaceAll(str, " ", "")
	num := []rune{}
	for _, v := range []rune(str) {
		if (v >= '0' && v <= '9') || (v >= 'a' && v <= 'z') || (v >= 'A' && v <= 'Z') {
			num = append(num, v)
		} else {
			if len(num) > 0 {
				new_arr = append(new_arr, string(num))
			}
			new_arr = append(new_arr, string(v))
			num = []rune{}
		}
	}
	if len(num) > 0 {
		new_arr = append(new_arr, string(num))
	}

	new_str := []string{}
	for _, v := range new_arr {
		lazy := strings.Join(pinyin.LazyPinyin(v, args), ",")
		if "" == lazy {
		} else {
			v = lazy
		}
		if "firstletter" == _style {
			v = string(v[0:1])
		}
		new_str = append(new_str, v)
	}

	return strings.Join(new_str, "")
}
